//
// Created by twetec on 25-6-22.
//

#ifndef NETWORK_PROBER_PROBE_HANDLE_ICMP_PROBE_TASK_H
#define NETWORK_PROBER_PROBE_HANDLE_ICMP_PROBE_TASK_H

#include <coroutine>

#include <network_prober/database/memory_db_holder.h>
#include <network_prober/database/file_db_holder.h>

namespace network_prober::probe
{
/**
 * ICMP IPv4
 */
// class ICMPProbeIPv4
// {
// public:
//     /**
//      *  观测
//      */
//     void probe();
//
//     void stopxx();
//
//     /**
//      * 观测完毕时回调
//      */
//     void setOnProbedCallback(std::function<void(std::int64_t)>&& callback);
//
//     /**
//      * @param interface 网口地址
//      * @param target 目标地址
//      */
//     ICMPProbeIPv4(const std::string& interface, const std::string& target);
//     ~ICMPProbeIPv4();
//
// private:
//     std::string m_interface;
//     std::string m_target;
//     asio2::iopool m_iopool;
//     std::unique_ptr<asio2::ping_ipv4> m_pingPtr;
//     std::function<void(std::int64_t)> m_onProbedCallback;
// };

/**
 *  观测处理
 */
class HandleICMPProbeIPv4Awaiter
{
public:
    /**
     * 构造函数
     * @param probeTask 观测任务数据
     */
    HandleICMPProbeIPv4Awaiter(const database::ProbeTaskModel& probeTask);
    /**
     * 析构函数
     */
    ~HandleICMPProbeIPv4Awaiter();

    /**
     * 任务是否需要执行await_suspend()
     * @return false 表示未准备好，需要暂停
     */
    bool await_ready();
    /**
     *  在协程暂停后，执行的方法
     * @param handle 协程promise对象句柄
     */
    void await_suspend(std::coroutine_handle<> handle);
    /**
     *  co_await 输出的值
     *  这里用于返回延迟的时间
     */
    std::int64_t await_resume();

private:
    std::string m_interface;
    std::string m_target;
    std::int64_t m_delay{-1};
};


/**
 * ICMP IPv6
 */
// class ICMPProbeIPv6 : public std::enable_shared_from_this<ICMPProbeIPv6>
// {
// public:
//     /**
//      *  观测
//      */
//     void probe();
//
//     /**
//      * 观测完毕时回调
//      */
//     void setOnProbedCallback(std::function<void(std::int64_t)> callback);
//
//     /**
//      * @param interface 网口地址
//      * @param target 目标地址
//      */
//     ICMPProbeIPv6(const std::string& interface, const std::string& target);
//     ~ICMPProbeIPv6();
//
// private:
//     std::string m_interface;
//     std::string m_target;
//     asio2::ping_ipv6 m_ping;
//     std::function<void(std::int64_t)> m_onProbedCallback;
// };

/**
 *  观测处理
 */
class HandleICMPProbeIPv6Awaiter
{
public:
    HandleICMPProbeIPv6Awaiter(const database::ProbeTaskModel& probeTask);

    /**
     * 任务是否需要执行await_suspend()
     * @return false 表示未准备好，需要暂停
     */
    bool await_ready();
    /**
     *  在协程暂停后，执行的方法
     * @param handle 协程promise对象句柄
     */
    void await_suspend(std::coroutine_handle<> handle);
    /**
     *  co_await 输出的值
     *  这里用于返回延迟的时间
     */
    std::int64_t await_resume();

private:
    std::string m_interface;
    std::string m_target;
    std::int64_t m_delay{-1};
};


}

#endif //NETWORK_PROBER_PROBE_HANDLE_ICMP_PROBE_TASK_H
